﻿/**
 * \brief 任务池中使用的线程模板类
 * \file CThreadPattern.h
 */

#ifndef __CTHREAD__PATTERN__H
#define __CTHREAD__PATTERN__H

#include "CTaskQueue.h"
#include "CTaskPoolThreadType.h"
#include "CTcpTaskPool.h"
#include "CTcpTask.h"

/**
 * \brief 线程模板类，把实现传入模板参数
 */
template <class _ThreadPolicy>
class CThreadPattern : public _ThreadPolicy
{
	public:
		/**
		 * \brief 构造函数
		 */
		CThreadPattern(CTcpTaskPool* _pool) : _ThreadPolicy(_pool) {};

		/**
		 * \brief 析构函数
		 */
		~CThreadPattern() {};

		/**
		 * \brief 加入等待队列
		 * \param pTask：任务
		 */
		void add(CTcpTask* pTask)
		{
			if(pTask)
			{
				this->_M_queue.push(pTask);
			}
		}

	private:
		/**
		 * \brief 线程主回调函数，派生类需要重新定义
		 */
		virtual bool run()
		{
			return _ThreadPolicy::runMe(this->_M_list);
		}

	private:
		/**
		 * \brief 加入任务列表
		 */
		virtual void addList()
		{
			this->_M_queue.checkExport(this->_M_list);
			this->epoolSize = this->_M_list._M_tasks.size();
		}
#if 0
		/**
		 * \brief 所有任务到回收
		 * \param _pool：任务池指针
		 */
		void recycleAll(CTcpTaskPool* _pool)
		{
			if(_ThreadPolicy::getThreadType() != enTaskPoolThreadType_recycle)
			{
				if(!_pool)
				{
					log::_ERROR_LOG("[CThreadPolicy] 任务池指针为空，%s", __PRETTY_FUNCTION__);
					return;
				}

				CTcpTask* pTask = this->_M_list.pop();
				while(pTask)
				{
					_pool->addRecycle(pTask);
					pTask = this->_M_list.pop();
				}

				this->_M_list.clear();
			}
		}
#endif
		/**
		 * \brief 从任务列表删除任务
		 * \param _pTask：任务指针
		 */
		virtual void remove(CTcpTask* _pTask)
		{
			if(_pTask)
			{
				this->_M_list.remove(_pTask);
				this->epoolSize = this->_M_list._M_tasks.size();
			}
		}

		/**
		 * \brief 从任务列表删除任务
		 * \param _iter：任务迭代器
		 */
		virtual void remove(CTaskList::_tasks_iter& iter)
		{
			this->_M_list.remove(iter);
			this->epoolSize = this->_M_list._M_tasks.size();
		}
};

#endif	/// __CTHREAD__PATTERN__H
